home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / rip_detect.nasl < prev    next >
Text File  |  2005-03-31  |  7KB  |  210 lines

  1. # This plugin was written from scratch by Michel Arboi <arboi@alussinan.org>
  2. # It is released under the GNU Public Licence (GPLv2)
  3. #
  4. # References:
  5. # RFC 1058    Routing Information Protocol
  6. # RFC 2453    RIP Version 2
  7. #
  8. #
  9. #      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  10. #     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11. #     | command (1)   | version (1)   |      must be zero (2)         |
  12. #     +---------------+---------------+-------------------------------+
  13. #     | address family identifier (2) |      must be zero (2)         |
  14. #     +-------------------------------+-------------------------------+
  15. #     |                         IP address (4)                        |
  16. #     +---------------------------------------------------------------+
  17. #     |                        must be zero (4) (netmask with RIP-2)  |
  18. #     +---------------------------------------------------------------+
  19. #     |                        must be zero (4) (next hop in RIP-2)   |
  20. #     +---------------------------------------------------------------+
  21. #     |                          metric (4)                           |
  22. #     +---------------------------------------------------------------+
  23. #
  24. #  1 - request     A request for the responding system to send all or
  25. #                  part of its routing table.
  26. #
  27. #  2 - response    A message containing all or part of the sender's
  28. #                  routing table.  This message may be sent in response
  29. #                  to a request or poll, or it may be an update message
  30. #                  generated by the sender.
  31. #
  32. #  3 - traceon     Obsolete.  Messages containing this command are to be
  33. #                  ignored.
  34. #
  35. #  4 - traceoff    Obsolete.  Messages containing this command are to be
  36. #                  ignored.
  37. #
  38. #  5 - reserved    This value is used by Sun Microsystems for its own
  39. #                  purposes.  If new commands are added in any
  40. #                  succeeding version, they should begin with 6.
  41. #                  Messages containing this command may safely be
  42. #                  ignored by implementations that do not choose to
  43. #                  respond to it.
  44. #
  45.  
  46. if(description)
  47. {
  48.   script_id(11822);
  49.   script_version ("$Revision: 1.18 $");
  50.  
  51.   name["english"] = "RIP detection";
  52.   script_name(english:name["english"]);
  53.  
  54.   desc["english"] = "
  55. This plugin detects RIP-1 and RIP-2 agents and display 
  56. their routing tables.
  57.  
  58. Risk factor : Low";
  59.  
  60.   script_description(english:desc["english"]);
  61.  
  62.   summary["english"] = "RIP server detection";
  63.   script_summary(english:summary["english"]);
  64.   script_category(ACT_GATHER_INFO); 
  65.   script_copyright(english:"This script is Copyright (C) 2003 Michel Arboi");
  66.   script_family(english:"Service detection");
  67.   exit(0);
  68. }
  69.  
  70. ##include("dump.inc");
  71. include('global_settings.inc');
  72. include("network_func.inc");
  73. include("misc_func.inc");
  74.  
  75. function rip_test(port, priv)
  76. {
  77.   local_var    soc, req, r, l, ver, report, i, n, ip_addr, mask, metric, next_hop, kbd, fam;
  78.  
  79. if (priv)
  80.   soc = open_priv_sock_udp(dport:port, sport:port);
  81. else
  82. soc = open_sock_udp(port);
  83.  
  84. if (!soc) return(0);
  85.  
  86. # Special request - See º3.4.1 of RFC 1058
  87.  
  88. r = "";
  89. for (v = 2; v >= 1 && strlen(r) == 0; v --)
  90. {
  91.   req = raw_string(1, v, 0, 0, 0, 0, 0, 0, 
  92.         0, 0, 0, 0,
  93.         0, 0, 0, 0,
  94.         0, 0, 0, 0,
  95.         0, 0, 0, 16);
  96.   send(socket: soc, data: req);
  97.   r = recv(socket:soc, length: 512);
  98.   ##dump(ddata: r, dtitle: "routed");
  99. }
  100.   close(soc);
  101.  
  102. l = strlen(r);
  103. if (l < 4 || ord(r[0]) != 2) return(0);    # Not a RIP answer
  104. ver = ord(r[1]); 
  105. if (ver != 1 && ver != 2) return(0);    # Not a supported RIP version?
  106.  
  107. set_kb_item(name: "/rip/" + port + "/version", value: ver);
  108.  
  109. report = strcat('A RIP-', ver, ' agent is running on this port.\n');
  110. n = 0;
  111. for (i = 4; i < l; i += 20)
  112. {
  113.   fam = 256 * ord(r[i]) + ord(r[i+1]);
  114.   if (fam == 2)
  115.   {
  116.     ip_addr = strcat(ord(r[i+4]), ".", ord(r[i+5]), ".", ord(r[i+6]), ".", ord(r[i+7]));
  117.     mask = strcat(ord(r[i+8]), ".", ord(r[i+9]), ".", ord(r[i+10]), ".", ord(r[i+11]));
  118.     nexthop = strcat(ord(r[i+12]), ".", ord(r[i+13]), ".", ord(r[i+14]), ".", ord(r[i+15]));
  119.     metric = ord(r[i+19]) + 256 * (ord(r[i+18]) + 256 * (ord(r[i+17]) + 256 * ord(r[i+16])));
  120.     if (n == 0) report += 'The following routes are advertised:\n';
  121.     n ++;
  122.  
  123.     kbd = strcat('/routes/',n);
  124.     set_kb_item(name: kbd + '/addr', value: ip_addr);
  125.  
  126.     if (ver == 1)
  127.       report += ip_addr;
  128.     else
  129.     {
  130.       report = strcat(report, ip_addr, '/', mask);
  131.       set_kb_item(name: kbd + '/mask', value: mask);
  132.     }
  133.  
  134.     if (metric == 16)
  135.       report += ' at infinity';
  136.     else if (metric <= 1)
  137.       report = strcat(report, ' at ', metric, ' hop');
  138.     else
  139.       report = strcat(report, ' at ', metric, ' hops');
  140.     set_kb_item(name: kbd + '/metric', value: metric);
  141.     if (ver > 1 && nexthop != '0.0.0.0')
  142.     {
  143.       report = strcat(report, ', next hop at ', nexthop);
  144.       set_kb_item(name: kbd + '/nexthop', value:nexthop);
  145.     }
  146.     report += '\n';
  147.   }
  148.   else
  149.   {
  150.     display("Unknown address family: ", fam, '\n');
  151.   }
  152. }
  153.  
  154. if (n > 0)
  155.   report += 'This information on your network topology may help an attacker \n\nRisk factor : Low';
  156. else
  157.   report += '\nRisk factor: None';
  158.  
  159. security_note(port: port, data: report, protocol: "udp");
  160. register_service(port: port, ipproto: "udp", proto: "rip");
  161.  
  162. # Remember that a machine may have to route packets even if it only 
  163. # has one interface!
  164.  
  165. if (!is_private_addr())
  166.   security_hole(port: port, protocol: "udp", data: 
  167. 'Running RIP on Internet is definitely a bad idea, as this "IGP" 
  168. routing protocol is neither efficient nor secure for wide area networks.
  169.  
  170. Solution: disable the RIP agent and use an "EGP" routing protocol
  171. Risk factor: High');
  172. else
  173.   if (ver == 1)
  174.     security_warning(port: port, protocol: "udp", data: 
  175. 'RIP-1 does not implement authentication. 
  176. An attacker may feed your machine with bogus routes and
  177. hijack network connections.
  178.  
  179. Solution : disable the RIP agent if you don\'t use it, or use
  180.            RIP-2 and implement authentication
  181. Risk factor : Medium');
  182.   else # RIP-2
  183.     if (! islocalnet())    # rip_poison will not be able to test the security
  184.       security_note(port: port, protocol: "udp", data: 
  185. 'RIP-2 allows authentication but Nessus has no fully reliable way 
  186. to check if it was properly implemented. 
  187. If not, an attacker may feed your machine with bogus routes and
  188. hijack network connections.
  189.  
  190. Solution : implement RIP-2 authentication if necessary or 
  191.            disable the RIP agent if you don\'t use it.
  192. Risk factor : Low / Medium');
  193. return(1);
  194. }
  195.  
  196. port = 520;
  197. #if (! get_udp_port_state(port)) exit(0); # Not very efficient with UDP!
  198.  
  199. if (rip_test(port: port, priv: 0)) exit(0);
  200. if (rip_test(port: port, priv: 1))
  201. {
  202.   security_note(port: port, protocol: "udp", data: "
  203. This RIP agent is broken: it only answers to requests where the source
  204. port is set to 520.
  205. This is not RFC compliant, but does not have security consequences.
  206.  
  207. Risk : None");
  208.   set_kb_item(name: "/rip/" + port + "/broken_source_port", value: TRUE);
  209. }
  210.